package com.janetfilter.core.models;

import com.janetfilter.core.enums.RuleType;

import java.util.HashMap;
import java.util.Map;

/**
 * 过滤规则类，表示一个具体的过滤规则
 * 包含规则类型和规则内容，用于匹配字符串内容
 */
public class FilterRule {
    // 支持的规则类型映射，将字符串映射到RuleType枚举
    private static final Map<String, RuleType> SUPPORTED_TYPE_MAP;

    // 静态初始化块，初始化支持的规则类型映射
    static {
        SUPPORTED_TYPE_MAP = new HashMap<>();

        // 将所有RuleType枚举值添加到映射中
        for (RuleType ruleType : RuleType.values()) {
            SUPPORTED_TYPE_MAP.put(ruleType.name(), ruleType);
        }
    }

    // 规则类型
    private RuleType type;
    // 规则内容
    private String rule;

    /**
     * 创建过滤规则实例
     * 
     * @param type 规则类型
     * @param rule 规则内容
     */
    public FilterRule(RuleType type, String rule) {
        this.type = type;
        this.rule = rule;
    }

    /**
     * 从字符串创建过滤规则
     * 
     * @param typeStr 规则类型字符串
     * @param content 规则内容
     * @return 创建的FilterRule实例，如果类型不支持则返回null
     */
    public static FilterRule of(String typeStr, String content) {
        // 查找对应的规则类型
        RuleType type = SUPPORTED_TYPE_MAP.get(typeStr.toUpperCase());
        if (null == type) {
            return null;
        }

        return new FilterRule(type, content);
    }

    /**
     * 获取规则类型
     * 
     * @return 规则类型
     */
    public RuleType getType() {
        return type;
    }

    /**
     * 设置规则类型
     * 
     * @param type 规则类型
     */
    public void setType(RuleType type) {
        this.type = type;
    }

    /**
     * 获取规则内容
     * 
     * @return 规则内容
     */
    public String getRule() {
        return rule;
    }

    /**
     * 设置规则内容
     * 
     * @param rule 规则内容
     */
    public void setRule(String rule) {
        this.rule = rule;
    }

    /**
     * 测试字符串是否匹配规则
     * 
     * @param content 要测试的字符串
     * @return 如果字符串匹配规则则返回true
     */
    public boolean test(String content) {
        // 调用规则类型对应的Ruler实现进行测试
        return type.getRuler().test(this.rule, content);
    }

    /**
     * 返回规则的字符串表示
     * 
     * @return 规则的字符串表示
     */
    @Override
    public String toString() {
        return "{type=" + type + ", rule=" + rule + "}";
    }
}
